#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <stack>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <vector>

using namespace std;

class Array {
public:
    typedef int * iterator;
    typedef const int * const_iterator;
    // constructor
    explicit Array(int n) : n(n),
                            data((int *) (calloc(sizeof(int), n))),
                            m_start(data), m_finish(m_start), m_end_of_storage(m_start + n) {};
    ~Array() {
        free(data);
    }
    Array &operator=(const Array &arr);

    // Iterators
    iterator begin() { return m_start; };
    const_iterator begin() const { return m_start; };
    iterator end() { return m_finish; };
    const_iterator end() const { return m_finish; };
    iterator rbegin() { return end();};
    const_iterator rbegin() const { return end(); };
    iterator rend() { return begin(); };
    const_iterator rend() const { return begin(); };

    // Capacity
    int size() const { return int(end() - begin()); };
    int capacity() const { return int(m_end_of_storage - m_start); }
    void resize(int);
    void resize(int , const int &);
    // Element access
    int &operator[](int);

    // Modifiers
    void push_bask(const int &);
private:
    int n;
    int *data;
    int *m_start, *m_finish, *m_end_of_storage;
};

Array &Array::operator=(const Array &arr) {
    // TODO
    if (this != &arr) {

    }
    return *this;
}

int &Array::operator[](int ind) {
    return data[ind];
}

void Array::push_bask(const int &num) {
}

void Array::resize(int new_size) {
    resize(new_size, 0);
}

void Array::resize(int new_size, const int &num) {
    int old_size = size();
    if (old_size < new_size) {

    } else {

    }
}


int main() {
    vector<int> arr1, arr2;
    arr1.push_back(1);
    arr1[0];
    arr2 = arr1;

    int a = 1;
    const int *b = &a;

    return 0;
}